#include "SDL.h"

#include "Hero.h"
#include "Surface.h"
#include "States.h"



Hero::Hero()
{
	cargar_grilla(&grilla, 7, 7);
	HeroCurrentState = INICIA;
	x = 50;
	y = 150;
	vel_x = 0;
	vel_y = 0;
	acel_x = 0;
	acel_y = 0;
	cuadro = 0;
	paso = 0;
	indicador = 0;

	animacion (INICIA, "37,37,37,37,37,38,39,40,41,42");
	animacion (PARADO, "0, 0, 1, 1, 2, 2");
	animacion (CAMINA, "8, 9, 10, 11, 12, 13, 14, 15, 16, 17");
	animacion (GOLPEA, "19, 20, 20, 19");
	animacion (SALTA, "3, 4, 5, 6, 7");
	
}

void Hero::Update()
{
	Uint8 * key;

	key = SDL_GetKeyState(NULL);

	indicador = avanzar_animacion();

	switch(HeroCurrentState)
	{
		case INICIA:
			if(indicador)
				SetState(PARADO);
			break;

		case PARADO:
			if(key[SDLK_SPACE])
				SetState(SALTA);
			else if(key[SDLK_RIGHT])
				SetState(CAMINA);
			else if(key[SDLK_LEFT])
				SetState(CAMINA);
			else if(key[SDLK_x])
				SetState(GOLPEA);
			break;

		case CAMINA:
			if(! key[SDLK_RIGHT])
				SetState(PARADO);
			else if(! key[SDLK_LEFT])
				SetState(PARADO);
			else if(key[SDLK_x]) 
				SetState(GOLPEA);
			else if(key[SDLK_SPACE]) 
				SetState(SALTA);
			break;

		case SALTA:
			if(indicador)
				SetState(PARADO);
			break;

		case GOLPEA:
			if(indicador)
				SetState(PARADO);
			break;
	}

	x += vel_x;
	y += vel_y;
	vel_x += acel_x;
	vel_y += acel_y;

}

void Hero::Render(SDL_Surface * screen, SDL_Rect * destino)
{
	SDL_Rect fuente;

	destino->x = x;
	destino->y = y;

	fuente.w = grilla.w;
	fuente.h = grilla.h;

	fuente.x = (cuadro % grilla.columnas) * fuente.w;
	fuente.y = (cuadro / grilla.columnas) * fuente.h;

	SDL_BlitSurface(grilla.ima, &fuente, screen, destino);
};

void Hero::SetState(enum HeroStates HeroNewState)
{
	HeroCurrentState = HeroNewState;

	Uint8 * key;

	key = SDL_GetKeyState(NULL);
	
	switch(HeroCurrentState)
	{
		case PARADO:
			vel_x = 0;
			vel_y = 0;
			break;

		case CAMINA:
			if(key[SDLK_RIGHT])
				vel_x = 5;
			else if(key[SDLK_LEFT])
				vel_x = -5;
			vel_y = 0;
			break;

		case SALTA:
			vel_x = 0;
			vel_y = -4;
			acel_y = 0.1;
			break;

	}
}

int Hero::cargar_grilla(struct grilla * obj, int filas, int columnas)
{
	Uint32 key;
	SDL_Surface *loadedImage , *optimizedImage;

	loadedImage = SDL_LoadBMP("hero.bmp");

	if(loadedImage == NULL)
	{
		printf("Error: loadedImage, %s\n", SDL_GetError());
		return 1;
	}

	optimizedImage = SDL_DisplayFormat(loadedImage);

	SDL_FreeSurface(loadedImage);

	if(optimizedImage == NULL)
	{
		printf("Error optimizedImage, %s\n", SDL_GetError());
		return 1;
	}

	//Color Magenta
	key = SDL_MapRGB(optimizedImage->format, 247, 178, 214);

	SDL_SetColorKey(optimizedImage, SDL_SRCCOLORKEY | SDL_RLEACCEL, key);

	obj->ima = optimizedImage;
	obj->filas = filas;
	obj->columnas= columnas;
	obj->w = obj->ima->w / columnas;
	obj->h = obj->ima->h / filas;

	return 0;
}

void Hero::animacion(enum HeroStates estado, char * cuadros)
{
	char buffer[1024];
	char * p;
	int i = 0;

	strcpy(buffer, cuadros);

	p = (char *) strtok(buffer, " ,");

	while(p)
	{
		animaciones[estado][i] = atoi(p);
		p = (char *) strtok (NULL, ", ");
		i++;
	}

	animaciones[estado][i] = FIN;
}

int Hero::avanzar_animacion()
{
	static int delay = 0;
	
	delay --;

	if(delay < 0)
	{
		paso += 1;
		cuadro = animaciones[HeroCurrentState][paso];

		delay = 10;

		if(cuadro == FIN)
		{
			paso = 0;
			cuadro = animaciones[HeroCurrentState][0];
			return 1;
		}

		return 0;
	}
}

